package main

import (
	// 替换为你的 proto 包路径
	"context"
	. "fastdp-ops/cmd/agent/config"
	. "fastdp-ops/cmd/agent/pkg"
	. "fastdp-ops/cmd/agent/zaplog"
	"fastdp-ops/pkg/agent/client"
	. "fastdp-ops/pkg/agent/modules"
	"fastdp-ops/pkg/agent/utils"
	pbExec "fastdp-ops/proto/exec"
	pbMachine "fastdp-ops/proto/machine"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"net"
	"os"
	"time"
)

func main() {
	// 初始化Zap日志实例
	InitZapLogger()
	// 程序退出时刷新日志缓冲区，确保日志完整输出
	defer Logger.Sync()

	// 从配置中获取Agent本机IP（Viper配置键：fastdp-agent.host）
	MachineIp := V.GetString("fastdp-agent.host")
	// 获取本机环境信息（如硬件、系统信息，已在utils包实现）
	info, err := utils.GetRealEnvInfo()
	// 封装本机IP和环境信息为注册请求结构体
	env_info := &pbMachine.RegMachineEnvInfo{MachineIp: MachineIp, Info: info}
	// 打印获取到的本机信息
	Logger.Info("本机信息获取结果", zap.Any("env_info", env_info))
	// 若获取环境信息失败，记录致命错误并退出
	if err != nil {
		Logger.Fatal("GetRealEnvInfo err", zap.Error(err))
	}
	// 创建带10秒超时的上下文（控制注册请求超时）
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel() // 确保上下文资源释放
	machineClient, err := client.GetMachineClient()
	if err != nil || machineClient == nil {
		Logger.Fatal("grpc连接server失败", zap.Error(err))
		os.Exit(3)
	}
	// 调用服务端的RegisterMachine方法注册本机
	regResp, err := machineClient.RegisterMachine(ctx, &pbMachine.RegisterRequest{
		EnvInfo: env_info,
	})
	if err != nil {
		// 注册失败时记录错误（非致命，继续启动服务）
		Logger.Error("注册到server失败", zap.Error(err))
	} else {
		// 注册成功时根据响应判断结果
		if regResp.Success {
			Logger.Info("注册成功")
		} else {
			Logger.Warn("注册被server拒绝", zap.String("message", regResp.Message))
		}
	}

	// 从配置中获取Agent监听端口，拼接为地址格式（如:8700）
	agentPort := ":" + V.GetString("fastdp-agent.port")
	// 监听指定TCP端口，准备启动gRPC服务
	lis, err := net.Listen("tcp", agentPort)
	if err != nil {
		// 监听失败时记录致命错误并退出
		Logger.Fatal("agent 启动失败：监听端口失败",
			zap.String("port", agentPort),
			zap.Error(err),
		)
	}

	// 创建gRPC服务实例
	s := grpc.NewServer()
	// 注册Agent端的服务实现（
	pbMachine.RegisterMachineEnvServiceServer(s, &AgentServer{})
	pbExec.RegisterExecServiceServer(s, &AgentExecServer{})
	// 打印服务启动成功信息
	Logger.Info("agent gRPC 服务启动成功",
		zap.String("listen_port", agentPort),
		zap.String("grpc_service", "MachineEnvService"),
	)

	// 启动gRPC服务（阻塞式运行，直到服务停止）
	if err := s.Serve(lis); err != nil {
		Logger.Fatal("gRPC 服务崩溃",
			zap.Error(err),
		)
	}
}
